home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / networking / amitcp / dialupv3.01.lha / dialup / commands.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-31  |  7.1 KB  |  257 lines

  1. #include "dialup.h"
  2.  
  3. extern BPTR                    mystderr;
  4. extern const UBYTE             *prgname;
  5. extern struct IOExtSer        *serialIOReq;
  6. extern struct timerequest    *timereq;
  7. extern BPTR                    repfile;
  8. extern UBYTE                *rxbuffer;
  9. extern LONG                    arg[];
  10. extern struct argspec        argtab[];
  11.  
  12. BOOL
  13. take( UBYTE *varbuf )
  14.     {
  15.     UBYTE rgcnt;
  16.  
  17.     if ( *(UBYTE *)arg[A_MSC] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem config (usually a RESET) */
  18.     if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ); /* ignore DTR ? */
  19.  
  20.     /* wait for A_RGS rings without timeout */
  21.     do
  22.         for(rgcnt = 0; rgcnt < *((LONG *)arg[A_RGS]); rgcnt++)
  23.             if ( !expectFromSer( (UBYTE *)arg[A_MRG], *((LONG *)arg[A_RGS]) > 0 && rgcnt == 0 ? 0x7FFFFFFF : 3) )
  24.                 break;
  25.     while ( rgcnt < *((LONG *)arg[A_RGS]) && !strstr(rxbuffer, BREAKSTR) ); /* count again, if timeout (not enough rings) but no user break */
  26.  
  27.     VERIFY ( !strstr(rxbuffer, BREAKSTR) );
  28.     VERIFY ( sendEx( (UBYTE *)arg[A_MOH], (UBYTE *)arg[A_MAC], *(LONG *)arg[A_MCT] ) );    /* take call */
  29.     VERIFY ( checkconnect(varbuf) );
  30.  
  31.     _OK_;
  32.     }
  33.  
  34.  
  35. BOOL
  36. connect(UBYTE *varbuf)
  37.     {
  38.     UBYTE PNidx = 0;
  39.     UBYTE lastPNidx = 0;
  40.     UBYTE **PNA;
  41.  
  42.     PNA = (UBYTE **)arg[A_PN];
  43.  
  44.     if ( *(UBYTE *)arg[A_MSC] )    VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem config (usually a RESET) */
  45.     if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ); /* ignore DTR ? */
  46.  
  47.     loop    /* redial loop */
  48.         {
  49.         if ( !arg[A_NRC] || arg[A_AA] ) /* reconnect or autoanswer ? */
  50.             {
  51.             sprintf(varbuf, (UBYTE *)arg[A_MAAC], *((LONG *)arg[A_RGS]) );
  52.             VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  53.             };
  54.  
  55.         /* dial or enter local analog loopback: */
  56.         if        ( arg[A_TEST] )                        sprintf(varbuf, "%s",    (UBYTE *)arg[A_MTC]);
  57.         else if ( *PNA[PNidx] == '!' )                sprintf(varbuf, "%s",    PNA[PNidx] + 1 );
  58.         else if ( ABBREV( PNA[PNidx], "AT" ) )        sprintf(varbuf, "%s",    PNA[PNidx] );
  59.         else                                           sprintf(varbuf, "ATD%s", PNA[PNidx] );
  60.  
  61.         VERIFY ( sendLine( varbuf ) );
  62.         sprintf(varbuf, "%s|%s|%s|%s", arg[A_MLB], arg[A_MNC], arg[A_MAC], arg[A_MLD]);
  63.         VERIFY ( expectFromSer( varbuf, arg[A_TEST] ? 5 : *(LONG *)arg[A_MCT] ) );
  64.  
  65.         if ( ! sStrMatch(rxbuffer, (UBYTE *)arg[A_MLB], varbuf ) )
  66.     break;    /* Do not redial if anything else than BUSY */
  67.  
  68.         DisplayBeep(NULL);
  69.         /* switch to next number */
  70.         if ( !PNA[++PNidx] )
  71.             {
  72.             PNidx = 0;
  73.             if ( *(LONG *)arg[A_RDD] == 0 ) _FAIL_;    /* no redial of the nuber(s) at all! */
  74.             };
  75.  
  76.         if ( !arg[A_NRC] || arg[A_AA] ) /* reconnect or autoanswer ? */
  77.             { /* set modem to not auto answer during wait: */
  78.             sprintf(varbuf, (UBYTE *)arg[A_MAAC], 0 );
  79.             VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  80.             };
  81.  
  82.         if ( strcmp(PNA[lastPNidx], PNA[PNidx]) == 0 || PNidx == 0)    /* same number or first one again? Then wait a bit. */
  83.             VERIFY ( expectFromSer( NULL, *(LONG *)arg[A_RDD] ) );
  84.         lastPNidx = PNidx;
  85.         };
  86.  
  87.     /* What did modem say: */
  88.     if ( sStrMatch(rxbuffer, (UBYTE *)arg[A_MLD], varbuf ) )
  89.         {
  90.         msg("Sorry! Modem doesn't get a dialtone.");
  91.         _FAIL_;
  92.         }
  93.     else
  94.         VERIFY ( checkconnect( varbuf ) );
  95.  
  96.     if ( arg[A_WUS] && *((UBYTE *)arg[A_WUS]) )    VERIFY ( sendToSer( (UBYTE *)arg[A_WUS] ) );
  97.  
  98.     if ( arg[A_LIP] && *((UBYTE *)arg[A_LIP]) )
  99.         {
  100.         /* handle login prompt */
  101.         if ( arg[A_TEST] )
  102.             {
  103.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_LIP] == argtab[A_LIP].deflt ? "Login:" : (UBYTE *)arg[A_LIP]);
  104.             VERIFY ( sendToSer( varbuf ) );
  105.             };
  106.         VERIFY ( exSend( (UBYTE *)arg[A_LIP], *((LONG *)arg[A_LTO]), (UBYTE *)arg[A_LIN] ) );
  107.         };
  108.     
  109.     /* handle password prompt */
  110.     if ( arg[A_PWP] && *((UBYTE *)arg[A_PWP]) )
  111.         {
  112.         if ( arg[A_TEST] )
  113.             {
  114.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_PWP] == argtab[A_PWP].deflt ? "Password:" : (UBYTE *)arg[A_PWP]);
  115.             VERIFY ( sendToSer( varbuf) );
  116.             };
  117.         VERIFY ( exSend( (UBYTE *)arg[A_PWP], 10, (UBYTE *)arg[A_PW] ) );
  118.         };
  119.  
  120.     /* handle snd login prompt */
  121.     if ( arg[A_SLIN] && *((UBYTE *)arg[A_SLIN]) )
  122.         {
  123.         if ( arg[A_TEST] )
  124.             {
  125.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_SLIP] == argtab[A_SLIP].deflt ? "2. Login:" : (UBYTE *)arg[A_SLIP]);
  126.             VERIFY ( sendToSer( varbuf) );
  127.             };
  128.         VERIFY ( exSend( (UBYTE *)arg[A_SLIP], *((LONG *)arg[A_LTO]), (UBYTE *)arg[A_SLIN] ) );
  129.         };
  130.  
  131.     /* handle snd pw prompt */
  132.     if ( arg[A_SPW] && *((UBYTE *)arg[A_SPW]) )
  133.         {
  134.         if ( arg[A_TEST] )
  135.             {
  136.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_SPWP] == argtab[A_SPWP].deflt ? "2. Password:" : (UBYTE *)arg[A_SPWP]);
  137.             VERIFY ( sendToSer( varbuf) );
  138.             };
  139.         VERIFY ( exSend( (UBYTE *)arg[A_SPWP], 10, (UBYTE *)arg[A_SPW] ) );
  140.         };
  141.  
  142.     /* check remote response for successful login: */
  143.     if ( arg[A_LOK] && *((UBYTE *)arg[A_LOK])  )
  144.         {
  145.         if ( arg[A_TEST] )
  146.             {
  147.             sprintf(varbuf, "\n\n**TEST: %s", (UBYTE *)arg[A_LOK]);
  148.             VERIFY ( sendToSer( varbuf) );
  149.             };
  150.         VERIFY ( expectFromSer( (UBYTE *)arg[A_LOK], *((LONG *)arg[A_LOT]) ) );
  151.  
  152.         if ( repfile ) Write(repfile, WS("\n"));
  153.         };
  154.  
  155.     _OK_;
  156.     }
  157.  
  158. BOOL
  159. hangup(UBYTE *varbuf)
  160.     {
  161.     if ( carrier() )
  162.         {
  163.         VERIFY ( commandmode(varbuf) );
  164.         VERIFY ( dropline(varbuf) );
  165.         }
  166.     else
  167.         {
  168.         VERIFY ( sendEx( (UBYTE *)arg[A_MRC], "?*\r", 3) )
  169.         Delay(25);
  170.         }        
  171.  
  172.     if ( arg[A_AA])
  173.         {
  174.         if ( arg[A_MSC] && *(UBYTE *)arg[A_MSC] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem *connect* config (usually a RESET) */
  175.         sprintf(varbuf, (UBYTE *)arg[A_MAAC], *(LONG *)arg[A_RGS] );    /* modem autoanswer */
  176.         VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  177.         if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ) ;    /* ignore DTR  */
  178.         }
  179.     else
  180.         {
  181.         if ( arg[A_MSC] && *(UBYTE *)arg[A_MSH] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSH], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem hangup config (usually a RESET) */
  182.         if ( !arg[A_NRC] )
  183.             {
  184.             sprintf(varbuf, (UBYTE *)arg[A_MAAC], 0 ); /* set modem to not auto answer: */
  185.             VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  186.             }
  187.         if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D2", (UBYTE *)arg[A_MOK], 2 ) ); /* honor DTR again: */
  188.         }
  189.  
  190.     _OK_;
  191.     }
  192.  
  193. BOOL
  194. commandmode(UBYTE *varbuf)
  195.     {
  196.     BPTR temp = repfile;
  197.  
  198.     Delay(50); /* send +++ : */
  199.     VERIFY ( sendToSer( (UBYTE *)arg[A_MOC] ) );
  200.     sprintf(varbuf, "%s|%s", (UBYTE *)arg[A_MOK], arg[A_MNC]);
  201.     repfile = NULL;
  202.     if ( !expectFromSer( (UBYTE *) varbuf, 3 ) )
  203.         {
  204.         repfile = temp;
  205.         VERIFY ( sendEx( (UBYTE *)arg[A_MRC], (UBYTE *)arg[A_MOK], 2 ) );  /* maybe already offline ? */
  206.         }
  207.     else repfile = temp;
  208.     _OK_;
  209.     }
  210.  
  211. BOOL
  212. dropline(UBYTE *varbuf)
  213.     {
  214.     if ( !arg[A_TEST] )    /* hangup line (ATH0) */
  215.         VERIFY ( sendEx( (UBYTE *)arg[A_MHC], (UBYTE *)arg[A_MOK], 2 ) )
  216.     else
  217.         {
  218.         sprintf( varbuf, "%s|%s", (UBYTE *)arg[A_MOK], arg[A_MNC]);
  219.         VERIFY ( sendEx( (UBYTE *)arg[A_MTO], varbuf, 2 ) );
  220.         };
  221.  
  222.     _OK_;
  223.     }
  224.  
  225.  
  226. BOOL
  227. query(UBYTE *varbuf)
  228.     {
  229.     BOOL connected = carrier();
  230.  
  231.     if ( connected ) VERIFY ( commandmode(varbuf) );
  232.     VERIFY ( sendEx( (UBYTE *)arg[A_MQC], (UBYTE *)arg[A_MOK], 8 ) );
  233.     if ( connected ) VERIFY ( sendEx( (UBYTE *)arg[A_MLC], (UBYTE *)arg[A_MAC], 2 ) );
  234.  
  235.     _OK_;
  236.     }
  237.  
  238.  
  239. BOOL
  240. checkconnect(UBYTE *buf)
  241.     {
  242.     UBYTE *anycon;
  243.  
  244.     if ( !(anycon = sStrMatch(rxbuffer, (UBYTE *)arg[A_MAC], buf ) ) )
  245.         {
  246.         msg(rxbuffer);
  247.         _FAIL_;
  248.         }
  249.     else
  250.         {
  251.         if ( arg[A_CS] && !sStrMatch(rxbuffer, (UBYTE *)arg[A_CS], buf) )
  252.             msg("Modem handshake result:\n %s", anycon);
  253.         _OK_;
  254.         };
  255.     }
  256.  
  257.